Slack platformを試す
The Slack platform offers a few different paths to enhancing your workspaces:
* The next generation Slack platform allows you to use Slack functions and custom functions as modular building blocks within your workflows and the workflows of others.
* Slack apps can use a range of APIs to access deeper levels of customization.
* In addition, Workflow Builder provides a no-code solution for routine tasks using triggers, steps, and variables.
Read on to determine the best path for you.
HTTPベースのAPIとは違うよ
馴染みがある概念もあるかもね(スラッシュコマンド、Botユーザ、OAuthなど)
でも、新たな気持ちで向き合うことをおすすめするよ
とのこと。
あとは
独自の Function をつくったり既存のものをつかったりして、Workflow のなかで組み合わせて使う
という旨の説明があった。
Slackの有料プランに入ってる必要がある
会社のWorkspaceで試させてもらおう、作りたいのは会社で使うやつだしね
単独でもつくれるし共有して複数人で開発することもできる
Workspace管理者の承認が必要な設定になってる場合もある
会社のやつだから、そうなってる
とのこと
One caveat (for now): the app management UI on api.slack.com/apps doesn’t support configuring next generation Slack apps.
次世代Slack platformでつくってアプリは、この「アプリ一覧画面」には表示されないよ、という意味かな?
api.slack.com/apps は "Your Apps" = 自作したアプリケーションの一覧 が表示される画面
quick start やろうぜ
テンプレートもたくさんあるよ
とのこと
ステップ1~5まである
1. Slack CLIをインストールする
code:bash
Finding the latest Slack CLI release version
✅ slack binary is found in the system. Checking if it's the same Slack CLI...
rbenv: slack: command not found
The `slack' command exists in these Ruby versions:
3.0.3
✋ We found another slack command in your system, please pass your preferred alias in the install script to avoid name conflicts
See example below:
slack command が被ってるよ〜とのこと
ruby 3.0.3 で slack-ruby-client が入ってるからだな
選択肢としては次のどちらか
slack-ruby-client gem を消す
今使っていないから消してもいいんじゃよなぁ
と思いつつ、今後使う是となったとき、あるいは新たにこのgemをインストールすることになったとき、Slack CLIが先にある状態だとどうなるんだろ?という疑問がある
Slack CLIにaliasをつける
こっちにしておくかなぁ
code:bash
Finding the latest Slack CLI release version
👋 Starting to download and install the Slack CLI and its dependencies...
📦 Installing the Slack CLI v2.8.0
######################################################################## 100.0%
Extracting the Slack CLI: /Users/tanaka.kentaro/.slack/bin/slack
Adding a symbolic link /usr/local/bin/slackcli to /Users/tanaka.kentaro/.slack/bin/slack
Installer doesn't have write access to /usr/local/bin to create a symbolic link. Script will try with sudo privileges
Password:
✨ Slack CLI was installed successfully
📦 Checking dependency: Deno
Installing Deno using Homebrew...
Running brew update --auto-update...
==> homebrew/core is old and unneeded, untapping to save space...
Untapping homebrew/core...
Untapped 2 commands and 6624 formulae (7,141 files, 687.8MB).
==> homebrew/cask is old and unneeded, untapping to save space...
Untapping homebrew/cask...
Untapped 4165 casks (4,251 files, 366.0MB).
==> Auto-updated Homebrew!
Updated 3 taps (heroku/brew, homebrew/core and homebrew/cask).
==> New Formulae
aerleon meson-python
apify-cli mgis
asnmap mjml
bazel-diff mysql-client@8.0
bazel-remote mysql@8.0
cargo-all-features notation
cargo-auditable orbiton
cargo-binutils proxify
cargo-deps python-click
cdi python-flit-core
cdxgen python-lxml
cloud-sql-proxy python-markupsafe
cloudlist python-mutagen
codelimit python-packaging
coder python-pycurl
counts python-pyparsing
ctpv python-pyproject-hooks
czkawka python-pytz
dnsrobocert riff
dolphie riscv64-elf-binutils
ebook2cw riscv64-elf-gcc
go@1.20 riscv64-elf-gdb
goread risor
hyfetch roadrunner
imgdiet rpmspectool
imgdiff shuffledns
kor terraform-graph-beautifier
ldid-procursus toxiproxy
legitify tpm
libjcat udp2raw-multiplatform
libxmlb vunnel
mariadb@11.0 wtfis
massdriver yazi
==> New Casks
apidog json-viewer sparkplate
applite pieces stash
clop pieces-os updf
dockx piphero viso
energiza shattered-pixel-dungeon voicepeak
hypercal simple-web-server
You have 49 outdated formulae installed.
==> Fetching dependencies for deno: sqlite
==> Fetching sqlite
######################################################################### 100.0%
######################################################################### 100.0%
==> Fetching deno
######################################################################### 100.0%
######################################################################### 100.0%
==> Installing dependencies for deno: sqlite
==> Installing deno dependency: sqlite
==> Pouring sqlite--3.43.0.arm64_monterey.bottle.tar.gz
🍺 /opt/homebrew/Cellar/sqlite/3.43.0: 11 files, 4.6MB
==> Installing deno
==> Pouring deno--1.36.3.arm64_monterey.bottle.tar.gz
==> Caveats
zsh completions have been installed to:
/opt/homebrew/share/zsh/site-functions
==> Summary
🍺 /opt/homebrew/Cellar/deno/1.36.3: 10 files, 80.4MB
==> Running brew cleanup deno...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see man brew).
==> Caveats
==> deno
zsh completions have been installed to:
/opt/homebrew/share/zsh/site-functions
✨ Deno is installed and ready!
💌 We would love to know how things are going. Really. All of it.
Survey your development experience with slackcli feedback
📄 Use of the Slack CLI should comply with the Slack API Terms of Service:
✨ You're all set! Next, authorize your CLI in your workspace with slackcli login
2. CLIを認証する
code:bash
% slackcli login
📋 Run the following slash command in any Slack channel or DM
This will open a modal with user permissions for you to approve
Once approved, a challege code will be generated in Slack
/slackauthticket ABC123defABC123defABC123defABC123defXYZ
? Enter challenge code
となるので、会社のワークスペースで /slackauthticket ABC123defABC123defABC123defABC123defXYZ を実行すると、challenge code が表示された
それをコピーして ? Enter challenge code の右に入力した
code:bash
✅ You've successfully authenticated! 🎉
Authorization data was saved to ~/.slack/credentials.json
💡 Get started by creating a new app with slackcli create my-app
Explore the details of available commands with slackcli help
確認
code:bash
% slackcli auth list
pepabo (Team ID: TXXXXXXX)
User ID: UXXXXXXX
Last Updated: 2023-09-02 11:51:32 +09:00
Authorization Level: Workspace
3. テンプレートからSlack Appをつくる
code:bash
⚙️ Creating a new Slack app in ~/my-app
📦 Installed project dependencies
✨ my-app successfully created
🧭 Explore the documentation to learn more
Read the README.md or peruse the docs over at api.slack.com/automation
Find available commands and usage info with slackcli help
📋 Follow the steps below to begin development
Change into your project directory with cd my-app/
Develop locally and see changes in real-time with slackcli run
When you're ready to deploy for production use slackcli deploy
% cd my-app
my-app という名前のディレクトリがつくられるのね
これちゃんと実装するときは普段コードたちを管理しているディレクトリに移動してからやらないとね
テンプレートはどんなもの?
4. developmentモードで起動する
code:bash
% slackcli run
? Choose a local environment
❱ Install to a new workspace or organization
この状態でエンターを押すと進む(一瞬どうすればいいか分からなかった)
code:bash
? Install to a new workspace or organization pepabo TXXXXXXXX
🔔 If you leave this workspace or organization, you can no longer manage the installed apps
Installed apps will belong to the workspace or organization if you leave the workspace
Updating local app install for "GMO Pepabo, Inc."
🔔 Administrator approval is required to install this app.
Alternatively, you can retry on a workspace without administrator approval turned on.
? Request approval to install this app? (Y/n)
いまはまだ承認リクエストを出したくないので n で
code:bash
You've declined to send a request to an admin. Please submit a request to install or update your app.
これだと起動できてないってことじゃよね?
う〜ん、手元のワークスペースを有料化しようかねぇ
いったん、上手くインストールできたと仮定して続きを読んでいく
CLIが Triggers の一覧を表示しようとして「Appに Triggers がインストールされてないよ」という旨の表示を出すらしい
Triggers は「Appにインストールされるもの」という概念なんだね
Triggers は Workflows の実行を引き起こすもの
(具体例として)Link Trigger は、チャンネル投稿時もしくはブックマーク追加時に、リンクになるショートカットURLを生成する
???どういうこと?
Triggers はトリガー定義ファイルから生成される
CLIはトリガー定義ファイルの中から1つ選ぶように要求してくる
code:bash
? Choose a trigger definition file:
triggers/sample_trigger.ts
Do not create a trigger
これをみると、「トリガーをつくらない」も選べそうだな
作成が完了するとこの表示になる
code:bash
⚡ Trigger successfully created!
Sample trigger (local) Ft0123ABC456 (shortcut)
Created: 2023-01-01 12:00:00 -07:00 (1 second ago)
Collaborators:
You! @You U123ABC456DE
Can be found and used by:
everyone in the workspace
ローカルで開発サーバーが起動する
5. Appを使う
Link Trigger をつくったときに表示されたショートカットURLをパブリックチャンネルに貼る
https://slack.com/shortcuts/Ft0123ABC456/XYZ123
"Start Workflow" ボタンとともにURLが展開される
そのボタンのクリックをTriggerとして、Workflowが実行される
sampleTrigger のなかで SampleWorkflow を指定してるな
ボタンクリック後に起こることは...
チャンネル選択とメッセージ入力のモーダルが表示される
チャンネルを選んでメッセージを打ち込んで "Send Message" ボタンを押すと、チャンネルにメッセージが投稿される
開発サーバーを停止する場合は Ctrl+c で止める
deno-starter-templateのコードを読んでみよう
まずは SampleWorkflow
3つのステップで構成されている
1. フォームを開く(Schema.slack.functions.OpenForm)
2. SampleFunctionDefinition を実行する
3. メッセージを送信する(Schema.slack.functions.SendMessage)
ステップ1と3はもともと用意されているFunctionを利用している
ステップ2は独自のFunctionを定義して利用している
SampleFunctionDefinition はどうなってる?
引数
message Schema.types.string
user Schema.slack.types.user_id
戻り値
updatedMsg Schema.types.string
具体的な処理
送信用のメッセージ文をつくる
code:ts
const updatedMsg = :wave: + <@${inputs.user}> +
submitted the following message: \n\n>${inputs.message}
Datastoreに保存する
code:ts
const sampleObject = {
original_msg: inputs.message,
updated_msg: updatedMsg,
object_id: uuid,
};
// Save the sample object to the datastore
await client.apps.datastore.put<typeof SampleObjectDatastore.definition>(
{
datastore: "SampleObjects",
item: sampleObject,
},
);
へ〜保存してたんだ、いいね
SampleObjectDatastore も気になるね
uuidは crypto.randomUUID(); で生成したもの
メッセージ文を返す
code:ts
return { outputs: { updatedMsg } };
SampleObjectDatastore はどうなってる?
code:ts
const SampleObjectDatastore = DefineDatastore({
name: "SampleObjects",
primary_key: "object_id",
attributes: {
object_id: {
type: Schema.types.string,
},
original_msg: {
type: Schema.types.string,
},
updated_msg: {
type: Schema.types.string,
},
},
});
簡単だね〜
だいたいわかったぜ〜